home *** CD-ROM | disk | FTP | other *** search
/ Amiga Tools 2 / Amiga Tools 2.iso / tex / macros / source / contrib / fp / fp-pas.sty < prev    next >
Text File  |  1995-03-09  |  3KB  |  117 lines

  1. \NeedsTeXFormat{LaTeX2e}
  2. \ProvidesPackage{fp-pas}[1994/08/29]
  3.  
  4. %version information
  5. \def\FP@pasversion{1.0}
  6. \message{%
  7.   `Fixed Point Pascal Triangle',%
  8.   \space\space%
  9.   Version \FP@pasversion%
  10.   \space(C) Michael Mehlich%
  11. }
  12.  
  13. %resolve dependencies
  14. \RequirePackage{fp-basic}
  15.  
  16. %%%public area (macros which may be used)%%%
  17.  
  18. \def\FPpascal#1#2{\FP@pascal{#1}{#2}}%pascal triangle for lines 0,...,63
  19.  
  20. %%%private fp-area (don't use these macros)%%%
  21.  
  22. %allocation of registers
  23. \countdef\FP@pas=50
  24. \countdef\FP@pasc=51
  25.  
  26. %addition of two natural numbers
  27. \def\FP@pasadd#1#2#3{%
  28.   % #1 macro, which gets the result
  29.   % #2 1st value
  30.   % #3 2nd value
  31.   {\FP@removeleadingzeros#2\relax%
  32.    \expandafter\FP@setintcounter\FP@tmp000000000000000000\relax%
  33.    \FP@xia=\FP@rega%
  34.    \FP@xib=\FP@regb%
  35.    %
  36.    \FP@removeleadingzeros#3\relax%
  37.    \expandafter\FP@setintcounter\FP@tmp000000000000000000\relax%
  38.    \FP@yia=\FP@rega%
  39.    \FP@yib=\FP@regb%
  40.    %
  41.    \advance\FP@xia\FP@yia%
  42.    \advance\FP@xib\FP@yib%
  43.    \ifnum\FP@xib<1000000000\relax\else%
  44.      \advance\FP@xia1\relax%
  45.      \advance\FP@xib-1000000000\relax%
  46.    \fi%
  47.    \ifnum\FP@xia<1000000000\relax\else%
  48.      \FP@errmessage{Overflow}%
  49.    \fi%
  50.    %
  51.    \ifnum\FP@xia=0\relax%
  52.      \edef\FP@tmpa{\the\FP@xib}%
  53.    \else%
  54.      \advance\FP@xib1000000000%
  55.      \edef\FP@tmpa{\the\FP@xia\expandafter\FP@ignorenext\the\FP@xib}%
  56.    \fi%
  57.    %
  58.    \global\let\FP@tmpa\FP@tmpa%
  59.   }%
  60.   %
  61.   \let#1\FP@tmpa%
  62. }
  63.  
  64. %the first two entries of the pascal-triangle
  65. \expandafter\edef\csname FP@pas0\endcsname{[1]}
  66. \expandafter\edef\csname FP@pas1\endcsname{[1,1]}
  67.  
  68. %which is the highest line of the pascal-triangle we have already computed?
  69. \expandafter\edef\csname FP@pascount\endcsname{1}
  70.  
  71. %compute next line of pascal-triangle
  72. \def\FP@pasdouble[#1]{%
  73.   % #1 previous line of pascal-triangle
  74.   \edef\FP@old{}%
  75.   \edef\FP@tmpb{}%
  76.   \@for\FP@new:=#1\do{%
  77.     \expandafter\if!\FP@old!\relax%
  78.       \edef\FP@old{\FP@new}%
  79.     \else%
  80.       \FP@pasadd{\FP@tmpa}{\FP@old}{\FP@new}%
  81.       \edef\FP@tmpb{\FP@tmpb,\FP@tmpa}%
  82.       \edef\FP@old{\FP@new}%
  83.     \fi%
  84.   }%
  85.   \global\edef\FP@tmpb{[1\FP@tmpb,1]}%
  86. }
  87.  
  88. %compute n-th line of pascal-triangle
  89. \def\FP@pascomp#1{%
  90.   % #1 which line to compute
  91.   \expandafter\FP@pasc\FP@pascount\relax%
  92.   \ifnum\FP@pasc<#1\relax%
  93.     \loop%
  94.       \ifnum\FP@pasc<#1\relax%
  95.         \expandafter\expandafter\expandafter\FP@pasdouble\csname FP@pas\the\FP@pasc\endcsname%
  96.         \advance\FP@pasc1\relax%
  97.     \edef\next{\noexpand\global\noexpand\let\csname FP@pas\the\FP@pasc\endcsname\noexpand\FP@tmpb}%
  98.     \next%
  99.       \repeat%
  100.   \fi%
  101.   \global\edef\FP@pascount{\the\FP@pasc}%
  102. }
  103.  
  104. \def\FP@pascal#1#2{%
  105.   % #1 macro, which gets the result
  106.   % #2 which line of the pascal-triangle to compute
  107.   {\FP@beginmessage{PASCAL}%
  108.    %
  109.    \FP@pas#2\relax%
  110.    \FP@pascomp\FP@pas%
  111.    \global\edef\FP@tmp{\csname FP@pas\the\FP@pas\endcsname}%
  112.    %
  113.    \FP@endmessage{}%
  114.   }%
  115.   \let#1\FP@tmp%
  116. }
  117.